{$CLEO .qa}
{$USE CLEO+}
{$USE Audio}
{$USE newOpcodes}
{$USE ini}

0000: NOP

script_name "INOUTQA"

// By ArtemQa146

const
    ped_1 = 31@
    Door_1 = 30@
    Door_black = 29@
    door_angle = 28@
    door_angle_open = 27@
    door_open = 26@
    door_mode = 25@
    coords_x = 24@
    coords_y = 23@
    coords_z = 22@
    door_model = 20@
    Mode_Go_In = 1
    Mode_Go_Out = 2
    Mode_Stay = 3
end

0087: coords_x = 0@ // (float)
0087: coords_y = 1@ // (float)
0087: coords_z = 2@ // (float)
0087: door_angle = 3@ // (float)
0087: door_model = 4@ // (float)



0E40: get_current_hour 1@
if or
    1@ > 21
    1@ < 6
then
    if
        0E4D: random_percent 5@
    then
    else
        repeat
        wait 0
        until not locate_char_distance_to_coordinates $PLAYER_ACTOR pos coords_x coords_y coords_z radius 150.0
        0A93: terminate_this_custom_script
    end
else
    if and
        not door_model == 1569
        not door_model == 1522
    then
        if
            0E4D: random_percent 5@
        then
        else
            repeat
            wait 0
            until not locate_char_distance_to_coordinates $PLAYER_ACTOR pos coords_x coords_y coords_z radius 150.0
            0A93: terminate_this_custom_script
        end
    end
end


0209: 1@ = random_int_in_ranges 1 11
if and
    1@ >= 1
    1@ <= 4
then
    door_mode = Mode_Go_In
end
if and
    1@ >= 5
    1@ <= 9
then
    door_mode = Mode_Go_Out
end
if
    1@ == 10
then
    door_mode = Mode_Stay
end

if or
    door_model == 1569
    door_model == 1522
then
    door_mode = Mode_Go_Out
    0E40: get_current_hour 1@
    if or
        1@ > 21
        1@ < 6
    then
        door_mode = Mode_Stay
    end
end

repeat
wait 0
04ED: load_animation  "PedEventsMod"
until 04EE:   animation "PedEventsMod" loaded

door_angle += 180.0
door_angle_open = 0.0

model.Load(2531)
model.Load(door_model)

if
    not model.Available(2531)
then
    repeat
    wait 0
    model.Load(2531)
    until model.Available(2531)
end
if
    not model.Available(door_model)
then
    repeat
    wait 0
    model.Load(door_model)
    until model.Available(door_model)
end
038B: load_requested_models
0E01: create_object_no_save door_model at coords_x coords_y coords_z offset 0 ground 0 to Door_1
0177: set_object Door_1 Z_angle_to door_angle
0400: store_coords_to 1@ 2@ 3@ from_object Door_1 with_offset -0.8 -0.35 0.0
01BC: put_object Door_1 at 1@ 2@ 3@

0400: store_coords_to 1@ 2@ 3@ from_object Door_1 with_offset 0.75 -0.25 -0.05
0E01: create_object_no_save door_model at 1@ 2@ 3@ offset 0 ground 0 to Door_black
0176: 1@ = object Door_1 Z_angle
0177: set_object Door_black Z_angle_to 1@
0F03: create_render_object_to_object Door_black model 2531 offset 0 0 0.0 rotation 0 0 0 store_to 1@
0E37: set_render_object_scale 1@ 1.5 0.5 1.1
08D2: object Door_black scale_model 0.0

0400: store_coords_to 1@ 2@ 3@ from_object Door_1 with_offset 0.8 1.0 0.0
0376: ped_1 = create_random_actor_at 1@ 2@ 3@
0176: 1@ = object Door_1 Z_angle
1@ += 180.0
0173: set_actor ped_1 Z_angle_to 1@
0E24: fix_char ped_1 ground 1 brightness 1 and_fade_in 0

if
    door_mode == Mode_Go_In
then
    0812: AS_actor ped_1 perform_animation "Door_idle" IFP "PedEventsMod" framedelta 2.0 loopA 1 lockX 0 lockY 0 lockF 0 time -1  // versionB
end

if
    door_mode == Mode_Go_Out
then
    0172: 1@ = actor ped_1 Z_angle
    1@ += 300.0
    0173: set_actor ped_1 Z_angle_to 1@
    0812: AS_actor ped_1 perform_animation "Door_inside" IFP "PedEventsMod" framedelta 10000.0 loopA 0 lockX 0 lockY 0 lockF 1 time -1  // versionB
    02AB: set_actor ped_1 immunities BP 1 FP 1 EP 1 CP 1 MP 1
end

if
    door_mode == Mode_Stay
then
    0812: AS_actor ped_1 perform_animation "Door_knock" IFP "PedEventsMod" framedelta 2.0 loopA 1 lockX 0 lockY 0 lockF 0 time -1  // versionB
end

0382: set_object Door_1 collision_detection 0
0382: set_object Door_black collision_detection 0
07F7: set_object Door_1 destructible 0
07F7: set_object Door_black destructible 0

model.Destroy(2531)
model.Destroy(door_model)
1@ = 0.0

door_open = 0

repeat
wait 0
if and
    056D:   actor ped_1 defined
    03CA:   object Door_1 exists
    03CA:   object Door_black exists
then

    // , ,    
    if or
        not is_char_script_controlled ped_1
        not locate_char_distance_to_coordinates ped_1 pos coords_x coords_y coords_z radius 5.0
        not $ACTIVE_INTERIOR == 0
    then
        break
    end
    
    if and
        8611:   not actor ped_1 performing_animation "Door_open_in"
        8611:   not actor ped_1 performing_animation "Door_open_out"
    then
        080E: get_actor ped_1 ped_event_to 3@
        if or
            actor.Dead(ped_1)
            3@ == 49
            3@ == 9
            051A:   actor ped_1 damaged_by_actor $PLAYER_ACTOR
        then
            break
        end
    end

    if
        door_mode == Mode_Go_In
    then
    
        if and
            02CB:   actor ped_1 bounding_sphere_visible
            0EE4: locate_char_distance_to_char $PLAYER_ACTOR char ped_1 radius 30.0
        then
            if
                0611:   actor ped_1 performing_animation "Door_idle"
            then
                0613: 2@ = actor ped_1 animation "Door_idle" time
                if
                    2@ > 0.9
                then
                    0812: AS_actor ped_1 perform_animation "Door_key" IFP "PedEventsMod" framedelta 2.0 loopA 1 lockX 0 lockY 0 lockF 1 time -1  // versionB
                    timera = 0
                    wait 300
                    continue
                end
            end
        end
        
        if
            0611:   actor ped_1 performing_animation "Door_key"
        then
            0613: 2@ = actor ped_1 animation "Door_key" time
            if
                2@ > 0.9
            then
                0172: 1@ = actor ped_1 Z_angle
                1@ += 300.0
                0173: set_actor ped_1 Z_angle_to 1@
                0812: AS_actor ped_1 perform_animation "Door_open_in" IFP "PedEventsMod" framedelta 1000.0 loopA 0 lockX 0 lockY 0 lockF 1 time -1  // versionB
                02AB: set_actor ped_1 immunities BP 1 FP 1 EP 1 CP 1 MP 1
                timera = 0
                door_open = 0
                wait 300
                continue
            end
        end
        
        if
            0611:   actor ped_1 performing_animation "Door_open_in"
        then
            0613: 2@ = actor ped_1 animation "Door_open_in" time
            if and
                door_angle_open < 2.0
                2@ > 0.95
            then
                0177: set_object Door_1 Z_angle_to door_angle
                door_open = 0
                door_angle_open = 0.0
                009B: destroy_actor ped_1
                ped_1 = -1
                break
            end
            gosub @Door_open_in
        else
            if
                door_open >= 1
            then
                0177: set_object Door_1 Z_angle_to door_angle
                door_open = 0
                door_angle_open = 0.0
                009B: destroy_actor ped_1
                ped_1 = -1
                break
            end
        end
    end
    
    
    if
        door_mode == Mode_Go_Out
    then
        if and
            02CC:   object Door_1 bounding_sphere_visible
            0EE4: locate_char_distance_to_char $PLAYER_ACTOR char ped_1 radius 30.0
            0611:   actor ped_1 performing_animation "Door_inside"
        then
            0812: AS_actor ped_1 perform_animation "Door_open_out" IFP "PedEventsMod" framedelta 1000.0 loopA 0 lockX 0 lockY 0 lockF 1 time -1  // versionB
            timera = 0
            door_open = 0
            wait 300
            continue
        end
        
        if
            0611:   actor ped_1 performing_animation "Door_open_out"
        then
            0613: 2@ = actor ped_1 animation "Door_open_out" time
            if and
                door_angle_open < 2.0
                2@ > 0.95
            then
                0177: set_object Door_1 Z_angle_to door_angle
                door_open = 0
                door_angle_open = 0.0
                02AB: set_actor ped_1 immunities BP 0 FP 0 EP 0 CP 0 MP 0
                break
            end
            gosub @Door_open_out
        else
            if
                door_open >= 1
            then
                0177: set_object Door_1 Z_angle_to door_angle
                door_open = 0
                door_angle_open = 0.0
                02AB: set_actor ped_1 immunities BP 0 FP 0 EP 0 CP 0 MP 0
                break
            end
        end
    end
    
    
    
    
    if
        door_mode == Mode_Stay
    then
        if and
            02CB:   actor ped_1 bounding_sphere_visible
            0EE4: locate_char_distance_to_char $PLAYER_ACTOR char ped_1 radius 30.0
        then
            if
                0611:   actor ped_1 performing_animation "Door_knock"
            then
                0613: 2@ = actor ped_1 animation "Door_knock" time
                if
                    2@ > 0.98
                then
                    if
                        0E4D: random_percent 75
                    then
                        0812: AS_actor ped_1 perform_animation "Door_knock_2" IFP "PedEventsMod" framedelta 2.0 loopA 0 lockX 0 lockY 0 lockF 1 time -1  // versionB
                        wait 500
                        continue
                    else
                        if
                            0E4D: random_percent 40
                        then
                            0172: 1@ = actor ped_1 Z_angle
                            1@ += 300.0
                            0173: set_actor ped_1 Z_angle_to 1@
                            0812: AS_actor ped_1 perform_animation "Door_open_in" IFP "PedEventsMod" framedelta 1000.0 loopA 0 lockX 0 lockY 0 lockF 1 time -1  // versionB
                            02AB: set_actor ped_1 immunities BP 1 FP 1 EP 1 CP 1 MP 1
                            timera = 0
                            door_open = 0
                            door_mode = Mode_Go_In
                            wait 300
                            continue
                        else
                            break
                        end
                    end
                end
            end
            if
                0611:   actor ped_1 performing_animation "Door_knock_2"
            then
                0613: 2@ = actor ped_1 animation "Door_knock_2" time
                if
                    2@ > 0.98
                then
                    if
                        0E4D: random_percent 50
                    then
                        0812: AS_actor ped_1 perform_animation "Door_knock" IFP "PedEventsMod" framedelta 2.0 loopA 0 lockX 0 lockY 0 lockF 1 time -1  // versionB
                        wait 500
                        continue
                    else
                        break
                    end
                end
            end
        end
    end
    
    
else
    break
end
until not locate_char_distance_to_coordinates $PLAYER_ACTOR pos coords_x coords_y coords_z radius 120.0

04EF: release_animation "PedEventsMod"

if
    0EEA: locate_char_distance_to_coordinates $PLAYER_ACTOR pos coords_x coords_y coords_z radius 50.0
then
    if 056D:   actor ped_1 defined
    then 01C2: remove_references_to_actor ped_1 // Like turning an actor into a random pedestrian
    end
    if 03CA:   object Door_1 exists
    then 01C4: remove_references_to_object Door_1 // This object will now disappear when the player looks away
    end
    if 03CA:   object Door_black exists
    then 01C4: remove_references_to_object Door_black // This object will now disappear when the player looks away
    end
else
    if 056D:   actor ped_1 defined
    then 009B: destroy_actor ped_1
    end
    if 03CA:   object Door_1 exists
    then 0108: destroy_object Door_1
    end
    if 03CA:   object Door_black exists
    then 0108: destroy_object Door_black
    end
end

repeat
wait 0
until not locate_char_distance_to_coordinates $PLAYER_ACTOR pos coords_x coords_y coords_z radius 200.0

0A93: terminate_this_custom_script



:Door_open_in
0176: 1@ = object Door_1 Z_angle
0613: 2@ = actor ped_1 animation "Door_open_in" time
    if and
        2@ > 0.8
        door_open == 1
    then
        1@ -= 2.0
        door_angle_open -= 2.0
        if door_angle_open < 2.0
        then door_open = 2
        end
    else
        if and
            2@ > 0.1
            door_open == 0
        then
            1@ += 2.0
            door_angle_open += 2.0
            if door_angle_open > 70.0
            then door_open = 1
            end
        end
    end
0177: set_object Door_1 Z_angle_to 1@
return

:Door_open_out
0176: 1@ = object Door_1 Z_angle
0613: 2@ = actor ped_1 animation "Door_open_out" time
    if and
        2@ > 0.65
        door_open == 1
    then
        1@ -= 2.0
        door_angle_open -= 2.0
        if door_angle_open < 2.0
        then door_open = 2
        end
    else
        if and
            2@ > 0.1
            door_open == 0
        then
            1@ += 2.0
            door_angle_open += 2.0
            if door_angle_open > 70.0
            then door_open = 1
            end
        end
    end
0177: set_object Door_1 Z_angle_to 1@
return